// 统一错误处理模块 - 根据详细设计文档的错误码规范

/**
 * 错误码分类（根据详细设计文档）
 */
const ErrorCodes = {
  // 客户端错误 4000-4999
  INVALID_PARAMS: { code: 4001, status: 400, message: '请求参数不正确，请检查后重试' },
  INVALID_CREDENTIALS: { code: 4002, status: 400, message: '账号或密码错误' },

  // 身份认证错误 4100-4199
  UNAUTHORIZED: { code: 4101, status: 401, message: '未提供访问令牌，请先登录' },
  TOKEN_EXPIRED: { code: 4102, status: 401, message: 'Token已过期，请刷新Token或重新登录' },
  ACCOUNT_LOCKED: { code: 4103, status: 403, message: '账户已被禁用或锁定' },

  // 业务逻辑错误 4200-4299
  ORDER_STATE_CONFLICT: { code: 4201, status: 409, message: '订单当前状态不允许此操作' },
  INSUFFICIENT_BALANCE: { code: 4202, status: 422, message: '余额不足' },

  // 系统内部错误 5000-5999
  INTERNAL_ERROR: { code: 5001, status: 500, message: '系统繁忙，请稍后重试' },

  // 第三方服务错误 6000-6999
  WECHAT_PAY_FAILED: { code: 6001, status: 502, message: '微信支付失败，请稍后重试' },
  SMS_SEND_FAILED: { code: 6002, status: 502, message: '短信发送失败，请稍后重试' },

  // 数据库错误 7000-7999
  DB_CONNECTION_ERROR: { code: 7001, status: 503, message: '数据库连接失败，请稍后重试' },
  DB_QUERY_ERROR: { code: 7002, status: 503, message: '数据查询失败，请稍后重试' }
};

/**
 * 创建错误响应
 * @param {Object} errorInfo - 错误信息对象
 * @param {String} customMessage - 自定义错误消息
 * @returns {Object} 错误响应对象
 */
function createErrorResponse(errorInfo, customMessage = null) {
  return {
    success: false,
    errorCode: errorInfo.code,
    errorMessage: customMessage || errorInfo.message,
    httpStatus: errorInfo.status
  };
}

/**
 * 统一错误处理中间件
 */
function errorHandler(err, req, res, next) {
  console.error('❌ 错误处理:', err);

  // 如果是自定义错误对象
  if (err.errorCode) {
    const errorInfo = Object.values(ErrorCodes).find(e => e.code === err.errorCode);
    if (errorInfo) {
      return res.status(errorInfo.status).json(createErrorResponse(errorInfo, err.message));
    }
  }

  // 数据库错误
  if (err.code && err.code.startsWith('ER_')) {
    return res.status(503).json(createErrorResponse(ErrorCodes.DB_QUERY_ERROR));
  }

  // 默认系统错误
  return res.status(500).json(createErrorResponse(ErrorCodes.INTERNAL_ERROR));
}

module.exports = {
  ErrorCodes,
  createErrorResponse,
  errorHandler
};

